﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TermEquation
{
    public class TestTask1:ITask
    {

        public const double mu1 = 1;
        public const double mu2 = 2;
        public const double ksi = 1.0 / 3.0;

        public double a(int i, double h)
        {
            if (i * h <= ksi)
                return MainTask.k1(ksi);
            else
            {
                if ((i - 1) * h >= ksi)
                    return MainTask.k2(ksi);
                else
                {
                    return h/((ksi-(i-1)*h)/MainTask.k1(ksi)+(i*h-ksi)/MainTask.k2(ksi));
                }
            }
        }

        public double d(int i, double h)
        {
            if ((i + 1 / 2.0) * h <= ksi)
                return MainTask.q1(ksi);
            else
            {
                if ((i - 1 / 2.0) * h >= ksi)
                    return MainTask.q2(ksi);
                else
                    return MainTask.q1(ksi) * (ksi - (i - 1 / 2.0) * h)/h + MainTask.q2(ksi)*((i+1/2.0)*h-ksi)/h;
            }
        }

        public double fi(int i, double h)
        {
            if ((i + 1 / 2.0) * h <= ksi)
                return MainTask.f1(ksi);
            else
            {
                if ((i - 1 / 2.0) * h >= ksi)
                    return MainTask.f2(ksi);
                else
                    return MainTask.f1(ksi)*(ksi-(i-1/2.0)*h)/h+MainTask.f2(ksi)*((i+1/2.0)*h-ksi)/h;
            }
        }

        public double GetSolution(double x)
        {
          double w1 = 0.81649658092772603273242802490196;
          double w2 = 0.912870929175276855761616304668;
            if (x <= ksi)
              return 0.2960328494152274259 * Math.Exp(w2 * x) - 0.1960328494152274259 * Math.Exp(-w2 * x) + 0.9;
            else
              return 1.2583238549506147748 * Math.Exp(w1 * x) + 1.1002849690422933455 * Math.Exp(-w1 * x) - 4.0 / 3.0;
        }
    }
}